#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "TSintactico.h"
#include "Token.h"

int TSintactico_Crear(TSintactico* as) {
  int iError = 0;
  as->m_iNumeroObjeto = 0;
  as->m_ebVieneClave = ebTrue;
  as->m_ebEnArray = ebFalse;
  return iError;
}

int TSintactico_PushToken(TSintactico* as, Token* token) {
  int iError = 0;
  switch (token->m_ettTipo) {
    case TOKEN_OBJETO_EMPIEZA:
      as->m_iNumeroObjeto = as->m_iNumeroObjeto + 1;
      as->m_ebVieneClave = ebTrue;
      printf(" -> OBJETO %i:\n", as->m_iNumeroObjeto);
      break;
    case TOKEN_OBJETO_TERMINA:
      printf(" <- FIN OBJETO %i:\n\n", as->m_iNumeroObjeto);
      break;
    case TOKEN_DOSPUNTOS:
      printf(": ");
      as->m_ebVieneClave = ebFalse;
      break;
    case TOKEN_COMA:
      if (as->m_ebEnArray == ebFalse) {
        as->m_ebVieneClave = ebTrue;
      };
      break;
    case TOKEN_STRING:
      if (as->m_ebVieneClave == ebTrue) {
        if (as->m_ebEnArray == ebFalse) {
          printf("     * CLAVE: \"%s\" ", token->m_szDato);
        };
      } else {
        if (as->m_ebEnArray == ebFalse) {
          printf("(String): \"%s\"\n", token->m_szDato);
        } else {
          printf("           - (String): \"%s\"\n", token->m_szDato);
        };
      };
      break;
    case TOKEN_NUMERO:
      if (as->m_ebEnArray == ebFalse) {
        printf("(Numero): %s\n", token->m_szDato);
        as->m_ebVieneClave = ebTrue;
      };
      break;
    case TOKEN_ARRAY_EMPIEZA:
      printf("\n         (Array): ARRAY\n");
      as->m_ebEnArray = ebTrue;
      break;
    case TOKEN_ARRAY_TERMINA:
      printf("         FIN ARRAY\n");
      as->m_ebEnArray = ebFalse;
      break;
    case TOKEN_TRUE:
      printf("(Logico): [True]\n");
      as->m_ebVieneClave = ebTrue;
      break;
    case TOKEN_FALSE:
      printf("(Logico): [False]\n");
      as->m_ebVieneClave = ebTrue;
      break;
  }
  return iError;
}

int TSintactico_terminarFlujo(TSintactico* as){
  int iError = 0;
  return iError;
}

int TSintactico_getUltimoError(TSintactico* as, int* codigo, char* mensaje){
  int iError = 0;
  return iError;
}
